library(DT)
library(plyr)
library(reactable)
library(tidyverse)
library(glpkAPI)
library(psych)
library(irtoys)
library(ltm)
library(plink)psychometrics)を軸に体系化されてきた項目反応理論の主眼
・「能力がこのくらいの人が、この問題を正解できる確率はどれくらいか?」
という問いに答えること
項目反応理論の利点
Computer-adaptive Testing: CAT) ができる問題と回答者のマトリックスに正解=1、不正解=0のパターンを作る
そのパターンに最も近くなるロジスティック曲線を問題の数だけ当てはめる
その際、確率的に最もありそうな基準(=尤度(ゆうど))を使う
受験者の能力と、問題の難易度も推定可能
→ 良問と悪問題が区別できる
item bank) を作る→ 受験者の解答結果しだいで出題問題を変える
→ 受験者の能力を推定する上で最も適切な問題を出題できる
→ 少ない問題・少ない時間で、受験者の能力を推定できる
古典的テスト理論 (classical test theory)
が直面する2つの問題 ・標本依存性 (sample
dependence) の問題
・項目依存性 (item dependence)
の問題
・受験者集団の能力が異なるから
→ テストの困難度の評価が、そのテストを受けたサンプル(集団)のレベルに依存する
・受験者集団のレベルが高い → 個々の受験者のテスト得点が高い → 集団全体の平均点が高い
・受験者集団のレベルが低い → 個々の受験者のテスト得点が低い → 集団全体の平均点が低い
・問題の困難度(難しさ)が異なるから
もし、去年と今年の問題が同一なら → 去年より20点学力が伸びた
しかし、今年より去年の問題の方が難しいなら
→ 今年のテストの平均点より、去年のテストの平均点は低い
→ 平均値が低い去年の生徒の方が学力が高い可能性がある
このことをテスト得点の項目依存性という
→ 異なるテストを比較することができない
受験者のテスト得点は、テスト個々の問題(=項目)の困難度によっても影響を受ける
→ テストに含まれる問題(= 項目)の難しさ(= 困難度)と受験者の能力を別々に推定し、同じものさしの上で評価する
item characteristice curve: ICC)
を使って、テストに含まれる「項目の難しさ」と「受験者の能力」を別々に推定まとめ
テストの素点を偏差値に換算したとしても、学校ごとの学力分布が異なる場合、受験者の能力を正しく比較できない
| 古典的テスト理論 | 項目反応理論 |
|---|---|
| 素点 | 潜在特性値 \(θ\)(シータ)= 受験者の能力 |
| 偏差値 | 項目特性(問題の困難度・識別力) |
| 項目特性と受験者の能力が交絡 | 項目特性と受験者の能力を別々に表現できる |
| → 困難度と受験者の能力を区別できない | |
item characteristice curve: ICC)困難度(Difficulty Parameter)→ ICCの曲線が横軸上のどの位置で50%の正答率を持つかを見ることで、その問題の難しさを判断できる
識別力(Discrimination Parameter)→ 曲線の傾きが大きいほど、能力の低い受験者と高い受験者をうまく区別できる項目であることがわかる
問1(黒色)は能力が低い受験者でも正解率が高い、比較的易しい問題.
問3(緑色)は受験者の能力がある程度高くないと、正解できない比較的難しい問題
問題を難しい順から易しい順位並びかえると、3 → 2 → 4 → 5 → 1
となる
曲線の傾きが最も大きい問題は 3
→ 能力の低い受験者と高い受験者をうまく区別できる問題は 3
次の節では、上の項目特性曲線の解釈についてさらに考えてみる
| 仮定 | 内容 |
|---|---|
| 1. 局所独立性 | |
| 2. 正答確率の単調増加性 | 問題の難易度の適切性 |
| 3. データの適合度 | 項目反応モデルに関するデータの適合度 |
「受験者 \(i\) における \(j\) 番目における項目に対する正誤を示すデータ \(u_{ij}\)」の意味
テスト理論の出発点は「正誤データ」(1は正解、0は不正解)
受験者が 3
人おり、1番目がA、2番目がB、3番目がC → 受験者の順番を \(i\)
で表す
項目が 3 つあり、1番目がQ1、2番目がQ2、3番目がQ3 → 項目の順番を\(j\)で表す
θ= 0の時| 詳細 | |
|---|---|
| \(P(\theta)\) | 能力θを持つ受験者が、ある項目に正答する確率 |
| \(\theta\) | 受験者の能力。通常、平均0・標準偏差1の正規分布に従うと仮定される |
| \(a\) | 識別力(discrimination)パラメータ |
| \(b\) | 困難度(difficulty)パラメータ |
| \(c\) | 推測(guessing)パラメータ(最低正答確率、通常0〜0.25程度) |
Rasch Model)\[P(\theta) = \frac{1}{1 + exp[-(\theta-b)]}\]
\[P(\theta) = \frac{1}{1 + exp[-a(\theta-b)]}\]
\[P(\theta) = c + \frac{1-c}{1 + exp[-a(\theta-b)]}\]
\[u_x^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{N-1}\]
\[P(u_1, u_2,..., u_n|\theta) = Π_{j=1}^nP_j(\theta)^{u_j}(1-P_j(\theta))^{1-u_j}\]
一次元性の仮定 各項目の正誤が、\(\theta\) の値の大小によってのみばらつく
↓
Akaike Information Criterion: AIC)
等の情報量基準を計算するのに使われるItem Information Function: IIF)というTest Information Function: TIF)IIF と TIF は、コンピュータ適応型テスト
(Computer Adaptive Test: CAT)
を実施する上で重要な役割を演じる| 集団 | 平均的能力 |
|---|---|
| 集団 A | 1 |
| 集団 B | 2 |
| 集団 | 困難度 |
|---|---|
| 集団 A | a + 1 |
| 集団 B | a |
同一の項目でも、より平均能力が低い集団Aからみると、集団Bからみた時と比べると、より困難度が高めに推定されるため
もしより平均能力が低い集団Aを「規準」と設定すれば
→ 集団Bから得られた項目母数を集団Aの尺度上に乗せれば
→ 集団Bから得られた項目母数を線形変換すればよい
複数の集団から得られた項目特性や潜在特性値を比較するためには
複数の尺度をまたいで定義される共通の尺度を定める
→ 共通尺度に他の尺度を会わせる操作を行う
→ この操作を「等化」と呼ぶ
等化とは
あるテストにおいて同一の設計のもとで作成された異なる版のテスト得点を、共通尺度上の得点に変換する統計的な手続き
| 変数名 | 詳細 |
|---|---|
| \(a^*_{jB}\) | テスト版Aの尺度上で表現されたテスト版Bの項目母数の変換後の値(=等化後の識別力) |
| \(b^*_{jB}\) | テスト版Aの尺度上で表現されたテスト版Bの項目母数の変換後の値(=等化後の困難度) |
| \(a_{jB}\) | テスト版Bの集団から得られた項目母数(=等化前の識別力) |
| \(b_{jB}\) | テスト版Bの集団から得られた項目母数(=等化前の困難度) |
\[a^*_{jB} = a_{jB} / K\] \[b^*_{jB} = Kb_{jB} + L\]
\[a^*_{jB} = a_{jB} / K\] \[b^*_{jB} = Kb_{jB} + L\]
| 方法 | 詳細 |
|---|---|
| 共通項目デザイン | 共通項目における項目母数を手がかりにする方法 |
| 共通受験者デザイン | 共通受験者による方法 |
ltmパッケージの中に入っているデータを使う
• The Law School Admission Testへの解答結果を採点
受験者数: 1000人
項目数:Section IVに含まれる5項目
正答なら1、誤答なら0
| 変数名 | 詳細 |
|---|---|
| ID | 受験者のID |
| Item1 | 1番目の項目への解答結果 (0 or 1) |
| Item2 | 2番目の項目への解答結果 (0 or 1) |
| Item3 | 3番目の項目への解答結果 (0 or 1) |
| Item4 | 4番目の項目への解答結果 (0 or 1) |
| Item5 | 5番目の項目への解答結果 (0 or 1) |
| SS | Item1-5の合計点 |
| class | 素点に基づく受験者のクラス分け |
•class: 1〜5で表され、値が高くなるほど素点の高いクラス
⇒ このデータをIRTに基づき分析し、項目やテストの特性を評価する -
分析で使うパッケージを読み込む
LSAT が含む変数名を確認する[1] "Item 1" "Item 2" "Item 3" "Item 4" "Item 5"
Item 1 を item1
に変更する(変数名から半角スペースを削除)LSAT <- LSAT |>
rename("item1" = "Item 1",
"item2" = "Item 2",
"item3" = "Item 3",
"item4" = "Item 4",
"item5" = "Item 5")item1 から item5 までの合計点を表す変数
total を作るLSAT <- LSAT |>
dplyr::mutate(total = rowSums(dplyr::across(item1:item5),
na.rm = TRUE)) # 欠損値(NA)があっても無視して合計するよう指定irtoysパッケージを使う| 使う関数 | 内容 | |
| 1. 正答率の計算 | colMeans() | データの適合性を検討 |
| 2. I-T相関の計算 | cor() | データの適合性を検討 |
| 3. 1 次元性の計算 | fa.parellel() | データの適合性を検討(psychパッケージ) |
| 4. 項目母数の推定 | est() | 「困難度」「識別力」の推定 |
| 5. 潜在特性値の推定 | mlebme() | 能力\(\theta\)の推定 |
| 6. 局所独立性の検討 | irf() & cor() | 推定値の妥当性を検討 |
| 7. 項目適合度の検討 | itf() | 推定値の妥当性を検討 |
| 8. 項目特性曲線 (ICC) の作成 | irf() & plot() | 結果の解釈 |
| 9. テスト特性曲線 (TCC) の作成 | trf() & plot() | 結果の解釈 |
| 10. テスト情報曲線 (TIC) の作成 | tif() & plot() | 結果の解釈 |
colMeans()colMeans()関数を使って正答率
(Correct Response Rate: crr)を計算item1 item2 item3 item4 item5
0.924 0.709 0.553 0.763 0.870
df_crr <- data.frame( # データフレーム名を指定(ここでは df_crr と指定)
item = names(crr), # 変数名を指定(ここでは item と指定)
seikai = as.numeric(crr) # 変数名を指定(ここでは seikai と指定)
) item seikai
1 item1 0.924
2 item2 0.709
3 item3 0.553
4 item4 0.763
5 item5 0.870
ggplot(df_crr, aes(x = seikai, y = item)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(seikai, 2)), # 小数第2位で丸める
hjust = 1.2, size = 6) + # 棒の内側に表示
labs(
title = "各項目の正答率",
x = "項目",
y = "正答率"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策 正答率の計算のポイント
・極端に正答率の高い/低い項目があるかどうか
- 極端に高い/低い項目がある場合 → 問題あり
- 極端に高い/低い項目がない場合 → 問題なし
→ ここでは極端に高い/低い項目がない → 問題なし
→ 次の分析に移る
cor()cor()関数を使って、素点 (item1 〜
item5) と合計点 total との相関を計算 [,1]
item1 0.3620104
item2 0.5667721
item3 0.6184398
item4 0.5344183
item5 0.4353664
it
は「「行名付きの1列行列(matrix)」」→ 使い勝手が悪いので、この matrix
をデータフレームに変換して、行名を項目名の列として追加する
# 行列をデータフレームに変換
df_it <- as.data.frame(it)
# 行名を項目名として列に追加
df_it$item <- rownames(df_it)
# 列名をわかりやすく変更(オプション)
colnames(df_it) <- c("correlation", "item")ggplot(df_it, aes(x = item, y = correlation)) +
geom_bar(stat = "identity", fill = "orange") +
geom_text(aes(label = round(correlation, 3)),
vjust = -0.5, size = 4) +
ylim(0, 0.7) +
labs(
title = "項目-合計相関(item-total correlation)",
x = "項目",
y = "相関係数"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策 item1 〜 item5) と各項目得点
(total) との相関は 0.36〜0.61の間I-T相関の計算のポイント ・各項目への反応 (item1〜item5) と合計点 (ss) との間にI-T 相関が認められるかどうか
| IT相関の値 | 評価 | 項目の扱い |
|---|---|---|
| 〜 0.2 | 極めて低い(要注意) | 除外を検討する |
| 0.2〜0.3 | やや低い | 内容によって再検討 |
| 0.3〜0.4 | 妥当なレベル | 保留・文脈による判断 |
| 0.4以上 | 良好(望ましい) | 採用して問題なし |
→ ここでは全て 0.2 以上の相関が認められる → 問題なし
→ 項目を除外せず、次の分析に移る
fa.parellel()一次元性の検討 ・各項目反応の背後に 1
つの潜在特性を仮定できるかどうか
- 1 つの潜在特性を仮定できない場合 → 問題あり
- 1 つの潜在特性を仮定できる場合 → 問題なし
→ ここでは・・・・・ → 問題なし
→ 次の分析に移る
→ 項目母数と潜在特性値の推定へ
・ここでは3つの項目反応モデルを扱う
• 項目母数の推定
•
潜在特性値は平均が0、分散が1の正規分布(標準正規分布)に従うと仮定して推定を行うのが一般的
| 特徴 | 1PLモデル(Raschモデル) | 2PLモデル(一般化ロジスティックモデル) |
|---|---|---|
| モデル式 | \(P(正答)= \frac{1}{1+e^-(\theta-b)}\) | \(P(正答)= \frac{1}{1+e^{-a}(\theta-b)}\) |
| 識別力 a | すべての項目で同じ(固定) | 項目ごとに推定 |
| 困難度 b | 項目ごとに推定 | 項目ごとに推定 |
| パラメータ数 | 項目数(b のみ)+1(a 固定) | 項目数 × 2(a と b をそれぞれ推定) |
| 分析対象 | 能力と困難度bの関係 | 能力、困難度 b、識別力の関係(より柔軟なモデル) |
→ 1PLモデルでは「困難度(bパラメータ)」だけが推定される
→ 2PLモデルでは「困難度(bパラメータ)」と「識別力(aパラメータ)」が推定される
→ 2PLモデルでは、項目ごとの「能力の区別のしやすさ」が明らかになる
1パラメタ・ロジスティックモデル (1PL)est関数(項目母数を推定する)を利用して項目母数を推定est関数はirtoysパッケージの中に入っている関数est(resp = LSAT[, 1:5], # テストデータを指定する引数
model = "1PL", # 1PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定$est
[,1] [,2] [,3]
item1 0.7551356 -3.6152634 0
item2 0.7551356 -1.3224198 0
item3 0.7551356 -0.3176309 0
item4 0.7551356 -1.7300890 0
item5 0.7551356 -2.7801702 0
$se
[,1] [,2] [,3]
[1,] 0 0.32664059 0
[2,] 0 0.14218199 0
[3,] 0 0.09767702 0
[4,] 0 0.16913567 0
[5,] 0 0.25104778 0
[6,] 0 0.06943327 0
$vcm
$vcm$Dffclt.item1
[1] 0.1066941
$vcm$Dffclt.item2
[1] 0.02021572
$vcm$Dffclt.item3
[1] 0.009540801
$vcm$Dffclt.item4
[1] 0.02860687
$vcm$Dffclt.item5
[1] 0.06302499
$vcm$Dscrmn
[1] 0.004820979
item1が最も簡単な問題(← 困難度 b
の値のマイナスが最も大きい)item3が最も難しい問題(← 困難度 b
の値のマイナスが最も小さい)item3の推定精度が最も高い(← 困難度 b
の標準誤差が最小)SE が小さい = 推定値の信頼性が高い• 識別力 a の値が項目間で同一
・理論的には 1PLでは識別力 a は固定されて推定されない
・しかし、ltmパッケージでは識別力 a も推定され同一の数値 (0.7551356)
に固定
・$vcm
は分散共分散行列で「分散(標準誤差の2乗)」として出力
→ 項目パラメータの不確実性を捉えるのに有益
1PLM分析結果のまとめ
・中程度の識別力(a ≈
0.76)で設計された、難易度に差のあるテストである
・困難度の範囲は −3.6 〜 −0.3
→ 低〜中能力者に適したテスト
・推定値の精度は全体的に良好(標準誤差 SE が小さい)
・項目ごとの識別力の違いに注目したければ 2PLモデルが有効
2 パラメタ・ロジスティックモデル (2PL)\[P(正答) = \frac{1}{1 + exp[-a(\theta -
b)]}\] a: 識別力(discrimination) → 項目ごとに異なる
b: 困難度(difficulty)
θ: 潜在能力(受験者のスキル)
est(resp = LSAT[, 1:5], # テストデータを指定する引数
model = "2PL", # 2PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定$est
[,1] [,2] [,3]
item1 0.8253717 -3.3597333 0
item2 0.7229498 -1.3696501 0
item3 0.8904752 -0.2798981 0
item4 0.6885500 -1.8659193 0
item5 0.6574511 -3.1235746 0
$se
[,1] [,2] [,3]
[1,] 0.2580641 0.86694584 0
[2,] 0.1867055 0.30733661 0
[3,] 0.2326171 0.09966721 0
[4,] 0.1851659 0.43412010 0
[5,] 0.2100050 0.86998187 0
$vcm
$vcm[[1]]
[,1] [,2]
[1,] 0.06659708 0.2202370
[2,] 0.22023698 0.7515951
$vcm[[2]]
[,1] [,2]
[1,] 0.03485894 0.05385658
[2,] 0.05385658 0.09445579
$vcm[[3]]
[,1] [,2]
[1,] 0.05411071 0.012637572
[2,] 0.01263757 0.009933553
$vcm[[4]]
[,1] [,2]
[1,] 0.03428641 0.07741096
[2,] 0.07741096 0.18846026
$vcm[[5]]
[,1] [,2]
[1,] 0.04410211 0.1799518
[2,] 0.17995180 0.7568684
| aの値 | 解釈 | 判断 |
|---|---|---|
| 〜0.50 | 非常に低い識別力 | 除外対象 |
| 0.50〜0.80 | やや低い | 保留または再検討 |
| 0.80〜1.50 | 妥当な識別力 | 採用可 |
| 1.50〜 | 高い識別力(理想的) | 積極的に採用 |
・目安:a ≥ 0.80 を合格ラインとすることが多い
・ただし、テストの目的や項目数によって柔軟に運用されます
| bの値 | 解釈 | 判断 |
|---|---|---|
| 〜-3 | 極端に簡単すぎる | 除外対象 |
| -2〜2 | 妥当な難易度範囲 | 採用してOK |
| 3〜 | 極端に難しすぎる | 除外対象 |
・bの理想範囲は、θがカバーする範囲(通常 -3〜+3) に収まること
・極端なb値(±3以上)は、能力に関係なく正答率が0または1に近くなりやすく、情報が少ない
・項目が能力をどれだけ区別できるかを示すパラメータ
・一般的に:
a < 0.5: 識別力が低い(望ましくない)
a ≈ 1: 中程度の識別力(良好)
a > 1.5: 高い識別力(非常に良い)
→ このテストの項目はすべて a ≈ 0.65〜0.89 → 中程度の識別力
item1が最も簡単な問題(← 困難度 b
の値のマイナスが最も大きい: -3.3597333)item3が最も難しい問題(← 困難度 b
の値のマイナスが最も小さい: -0.2798981)item3の推定精度が最も高い(← 困難度 b の標準誤差が最小:
0.09966721)2PL分析結果のまとめ
・全体的に簡単な項目に偏っている
・item3 は 適度な難易度・高い識別力で、IRT的には非常に良い項目
・item1とitem5 は簡単すぎて識別力も低め
→ テストの目的によっては、除外や見直しすべき
・困難度という観点から、困難度が −3 以下の item1 と
item5 は削除対象
・代わりに難しい項目を追加するとバランスがよくなる
・識別力の高い(a > 1.2)項目を加えると、能力の区別精度が上がる
・b ≈ 0〜+2 の項目を加えると、高能力者の識別力も補強できる
3 パラメタ・ロジスティックモデル (3PL)est(resp = LSAT[, 1:5], # テストデータを指定する引数
model = "3PL", # 3PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定$est
Dscrmn Dffclt Gussng
item1 0.2945829 -8.2376044 0.09306093
item2 12.0612683 0.9892132 0.64301268
item3 14.6898035 1.0033451 0.45379015
item4 20.8485498 -0.5737457 0.01076137
item5 0.4268108 -3.9246143 0.21505474
$se
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
[4,] NaN NaN NaN
[5,] NaN NaN NaN
$vcm
$vcm[[1]]
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
$vcm[[2]]
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
$vcm[[3]]
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
$vcm[[4]]
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
$vcm[[5]]
[,1] [,2] [,3]
[1,] NaN NaN NaN
[2,] NaN NaN NaN
[3,] NaN NaN NaN
$se などに適当な数値が入っていない
NaNmlebme()mlebme関数を利用して潜在特性値を推定mlebme関数はirtoysパッケージの中に入っている関数head(mlebme(resp = LSAT[, 1:5], # テストデータを指定
ip = para.2PL$est, # データに対し2PLMを仮定
method = "BM")) # 最尤推定法 (ML) による潜在特性値の推定を指定 est sem n
[1,] -1.895392 0.7954829 5
[2,] -1.895392 0.7954829 5
[3,] -1.895392 0.7954829 5
[4,] -1.479314 0.7960948 5
[5,] -1.479314 0.7960948 5
[6,] -1.479314 0.7960948 5
resp: テストデータを指定する引数ip:
テストに含まれる各項目の項目母数を指定する引数para.2PL$est と指定method: どの推定法を用いて潜在特性値を推定するかML と指定BM と指定est)sem)n)irf() &
cor()一次元性の仮定 各項目の正誤が、潜在特性値 \(\theta\) の値の大小によってのみばらつく
• 局所独立性の検討は \(Q_3\)統計量に基づいて行われることが多い
• \(Q_3\)統計量とは、各項目への回答(観測値)からその期待値を引き
→ 得られた残差得点間の相関を求めることで得られる
- \(Q_3\)統計量は、各項目への反応(=
観測値) からその期待値(=
項目反応モデルにより計算される正答確率)を引き
→ 得られた残差得点間の相関を求めることで得られる統計量
- その絶対値が 0 に近いほど、項目反応間に局所独立性を仮定できる
• たとえば今の場合、item1 の残差得点\(d_1\)は次の式で表せる
\[d_1 = u_1 - \hat{P_1(\theta)}\]
item1
への解答結果(正答なら1、誤答なら0)irf関数を利用して正答確率 ($f)
を推定• irf関数では2PLMを仮定
• para.2PL$est と指定
→ データに対し2PLMを仮定したときの項目母数の推定値を各項目の項目母数として指定
• theta.est[, 1] と指定
→ データに対し2PLMを仮定したときの潜在特性の推定値を指定
⇒ 結果はPとして保存
| 変数 | 内容 |
|---|---|
| $x | 各受験者の潜在特性値\(\theta\)(能力) |
| $f | 正答確率の推定値 |
| 行 | 受験者 (1,000名) |
| 列 | 項目 (item1〜item5) |
1 ≦ j ≦5 )P$fと指定することで,正答確率の推定値が抽出される(LSAT,1:5]) から正答確率を引いた残差得点を
\(d\) に保存 item1 item2 item3 item4 item5
1 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
2 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
3 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
4 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
5 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
6 -0.8252089 -0.4801900 -0.2557741 -0.5661590 0.2533129
cor関数を利用して \(Q_3\) 統計量の値を計算 item1 item2 item3 item4 item5
item1 1.00000000 -0.04142824 -0.04101429 -0.064167975 -0.062538809
item2 -0.04142824 1.00000000 -0.11322248 -0.097060194 -0.029585197
item3 -0.04101429 -0.11322248 1.00000000 -0.092262203 -0.104216701
item4 -0.06416797 -0.09706019 -0.09226220 1.000000000 -0.003656669
item5 -0.06253881 -0.02958520 -0.10421670 -0.003656669 1.000000000
局所独立性の検討のポイント
各項目の正誤が、潜在特性値 \(\theta\)
の値の大小によってのみばらつくかどうか
。\(Q_3\) の絶対値が 0
に近いほど、項目反応間に局所独立性を仮定できる
・\(Q_3\) の値の絶対値が
0.2以上の場合 → 問題あり: 局所依存性の疑い(Chen
& Thissen, 1997)
・\(Q_3\) の値の絶対値が
0.2以下の場合 → 問題なし
→ ここでは\(Q_3\)
の値の絶対値が全て 0.2以下 → 問題なし
→ 局所独立性が成立していることを示唆
→ 次の分析に移る
・局所依存性:局所独立性が満たされていない状態のこと
⇒ \(Q_3\)はあくまで一つの基準に過ぎないので注意が必要
itf()・「各項目が理論モデル(例:2PLモデル、3PLモデル)にちゃんと従っているかどうか」を評価するものが項目適合度
(Item Fit)
• IRTにおいては項目反応モデルへの適合度を検討することも重要
• ここでは、itf関数を利用して item1
の項目適合度を検討してみる
resp はテストデータを指定する引数irtoys::itf(resp = LSAT[, 1:5], # 応答データ [受験者, 項目]
item = 1, # 1番目の項目適合度の検討を指定する
ip = para.2PL$est, # 2PLモデルによる推定された項目パラメータ
theta = theta.est[, 1]) # 受験者ごとの能力推定値(θ) Statistic DF P-value
10.0741811 6.0000000 0.1215627
Ability) Proportion right)項目適合度でわかること
その項目がIRTモデルに「合っているか」どうか
・各項目の「実際のデータによる反応パターン」と、IRTモデルが「理論的に予測する反応パターン」を比較
→ もしズレていたら、モデルの仮定がその項目には合っていないということ
・モデルに合っていない項目を使うと、潜在特性値\(θ\)(能力)の推定が不正確になる可能性あり
・項目の品質をチェックし、不適切な項目を修正・削除する判断材料になる
・バイアスの検出(DIF:Differential Item Functioning)の手がかりにもなる
| 現象 | 可能性 |
|---|---|
| 実際の正答率がモデルより低い | 問題文がわかりにくい/迷いやすい選択肢 |
| 特定の能力層だけ挙動がおかしい | バイアスがある、ミスリードされやすい項目 |
| 正答率がランダムに近い | 推測が強く影響(cパラメータが不十分) |
| 認知的に複雑すぎる | 単一の「能力θ」では説明できない |
適合度を判断する指標:
S-X²統計量(Orlando &
Thissenの項目適合度指標)
・より精度の高い適合度検定(特に2PLや3PLに使う)
・能力をグループ(通常は10分位など)に分け
→ 各グループでのモデルによる期待正答率と、実際の正答率の差を使う
→ カイ二乗型の統計量として適合度を評価
= これは、カイ二乗分布に従う統計量だが、S-X²特有の方法
→ 通常のカイ二乗適合度検定とは区別される
結果の解釈
p値が有意水準 (0.05) よりも大きい:
p-value = 0.1215627
→ 帰無仮説は棄却できない
→
「当てはめた項目反応モデルがデータに適合している」と判断される
itf 関数を使用した際に出力される図において
実線と円の間の乖離が大きいほど、モデルがデータに当てはまっていないと判断
• 項目特性曲線(Item Characteristic Curve,ICC)
・ある項目(= 問題)に対して、受験者の能力 \(\theta\) に応じた正答確率を表す曲線
・潜在特性値 \(\theta\)
の値毎に正答確率を計算し、プロットしたもの
・横軸・・・潜在特性値\(θ\)(能力)
・縦軸・・・正答確率(0 〜 1)
ip:
テストに含まれる各項目の項目母数を指定する引数para.2PL$est と指定plot(x = P, # xは引数、irf関数で推定した結果を指定する
co = NA, # ICCの色を指定/項目毎に異なる色でICCを描く
label = TRUE) # 各ICCに項目の番号がつく
abline(v = 0, lty = 2) # x = 0 の縦点線を引く横軸・・・潜在特性値 \(θ\)
(Ability)
縦軸・・・正答確率 (Probability of a correct response)
\[P_j(\theta|a_j, b_j) = \frac{1}{1 + exp(-Da_j(\theta - b_j))}\]
項目特性曲線 (ICC) でわかること(簡易版)
● item3
の曲線は中央にあり、識別力(a)も高め → 優れた項目
● item1・item5は曲線が左に寄っていて、問題が簡単すぎる項目
● 曲線が急なものほど、能力の違いをよく識別できる(item3が典型)
・item3 は θ ≒ -0.3 あたりで急激に上昇
→ 能力値が上がるにつれて正答確率が鋭く上がる
→ 識別力が高い
→ このような項目は、平均的な受験者を的確に弁別する良い項目
項目特性曲線 (ICC) でわかること(詳細版) 1. 項目の難易度(bパラメータ)
・カーブが θ (Ability) = b の点で50%の正答率
・この「50%の正答率になるθ」が、その項目の難易度
・最も正解率が低くて易しい問題 => item3
・最も正解率が高くて難しい問題 => item1
2.
識別力(aパラメータ)
・カーブの傾きの急さが識別力
・急勾配 →
わずかな能力の差で正答確率が大きく変わる(=識別力が高い)=>
item3
・なだらか →
誰にとっても似たような正答確率(識別力が低い) =>item1
4.
項目の機能(差別性や妥当性)
・ICCの形から「この項目が誰にとって意味のある問題か」がわかる
・能力の低い人〜高い人まで同じ正答率 → 区別がつかない問題
・特定のθ (Ability)で大きく変化 →
そのあたりの能力の見極めに有効
| TICの山の位置 | 意味 | 対象 |
|---|---|---|
| θ = 0 周辺 | 平均均的な受験者向け | 一般的な学力テスト |
| θ > 0(右寄り) | 高能力者向け | 難関資格・上級試験 |
| θ < 0(左寄り) | 初級者・低能力者向け | 基礎力診断など |
5. ICCの形の解釈
| ICCの形 | 解釈 |
|---|---|
| 急で真ん中で立ち上がる | 難易度ちょうどよく、識別力が高い良問 |
| なだらかに上がる | 識別力が低い、あまり差がつかない |
| 右側で上がる | 難しい問題(上位者向け) |
| 左側で上がる | 易しい問題(初心者向け) |
| *底上げされて始まる | 推測による正答の影響あり(cパラメータが高い) |
・通常のICCなら、能力がないとほぼ絶対に解けないはず
・*「底上げされて始まる」というのは「能力が低くても当たる可能性がある」こと
・例:選択肢を勘で当てる(=
推測による正答)、ヒントがある、構造上バイアスがあるなど
trf() &
plot()• 潜在特性値の値毎に素点の期待値を計算しプロットする
- trf関数を使ってテスト情報量を計算
→ plot関数で TCC を作成
E <- trf(ip = para.2PL$est) # データに対し2PLMを仮定
# ip: テストに含まれる各項目の項目母数を指定する引数
plot(x = E) # 様々な潜在特性値における素点の期待値(Expectation)
横軸・・・潜在特性値 (Ability)
縦軸・・・正答確率 (Proportion right)
テスト特性曲線 (TCC)
でわかること 1. 受験者の能力
\(\theta\)
と期待得点の関係
・実線が右肩上がり
→ 受験者の能力が上がるにつれて、得点も上がる傾向あり
2.
テストの難易度と分布の様子
・受験者の能力 \(\theta\) が 0
のあたりで急に得点が上がっている場合
→ 平均的な能力の人向けのテスト
・受験者の能力 \(\theta\) が 2
〜 4 のあたりで急に得点が上がっている場合
→ 平均以上の能力の人向けのテスト
・受験者の能力 \(\theta\) が −4
〜 −2 のあたりで急に得点が上がっている場合
→ 平均以下の能力の人向けのテスト
3.
得点分布の歪みや限界
・TCCの傾きが緩やかな部分
→ その能力帯では得点の変化が鈍い(= 差がつきにくい)
・正答確率の上限や下限に近い部分が平坦になっている場合は
→ 高得点者と低得点者の差がつきにくい
• テスト情報曲線 (Test Information Curve,TIC)
-
「テストがどの能力レベル(θ)でどれくらい正確に測れているか」を可視化できる
• 潜在特性値の値毎にテスト情報量を計算しプロットする
- tif関数を使ってテスト情報量を計算
→ plot関数で TIC を作成
I <- irtoys::tif(ip = para.2PL$est) # データに対し2PLMを仮定
# x: tif関数で推定した結果を指定する引数
plot(x = I) # ip: テストに含まれる各項目の項目母数を指定する引数 ・横軸・・・潜在特性値\(θ\)(能力)
・縦軸・・・テスト情報量
・実線・・・テスト情報曲線
→ 当該潜在特性値におけるテスト情報量をつなぎ合わせたもの
テスト情報曲線 (TIC) でわかること
1.
どの能力レベルを正確に測れているか?
・情報量が高いところ → そのθレベルでテストが高精度
=> \(\theta =
−2\)付近の情報量が最も高い → \(\theta
= −2\)のレベルでテストが高精度
・情報量が低いところ → そのθレベルではテストの精度が低い => \(\theta = −4\)付近の情報量が最も低い → \(\theta = 4\)のレベルでテストが低精度
例:TICがθ=0の周辺で高ければ、「平均的な人を測るのに最適なテスト」だといえる
2.
テストの設計意図が見える
・TICがどこで山になるかを見ることで、そのテストがどんな対象向けかが分かる
・TICが\(\theta =
−2\)付近で山になっている
→ このテストは比較的能力の低い人向け
・TICがどこで山になるかを見ることで
=> そのテストがどんな対象向けかが分かる
| TICの山の位置 | 意味 | 対象 |
|---|---|---|
| θ = 0 周辺 | 平均均的な受験者向け | 一般的な学力テスト |
| θ > 0(右寄り) | 高能力者向け | 難関資格・上級試験 |
| θ < 0(左寄り) | 初級者・低能力者向け | 基礎力診断など |
・ここではTICの山の位置が左より → 平均均的な受験者向けだとわかる
3.
信頼性の高さ(精度)もわかる
・情報量が高い=その範囲の 標準誤差(SE)が小さい
・標準誤差との関係:
\[SE(\theta) = \frac{1}{\sqrt{{I(\theta)}}}\]
・つまり、情報量が大きいと \(\theta\) の推定がブレにくい(= 信頼できる)
項目適合度の結果のポイント
どの潜在特性値 \(\theta\)
の値で、情報量が最大になるか
・潜在特性値が −2 の辺りでテスト情報量が最大
⇒ 潜在特性値\(θ\)(能力)が低い( −2
の辺り )受験者の推定精度が最も高くなる
irt_exercise_4.1.csvは、11問の正誤問題(1が正答、0が誤答)を65人の受験が受験した試験結果である。 このデータには次の3つの変数が含まれている。
| 変数名 | 詳細 |
|---|---|
| ID | 受験者のID |
| Q1-Q11 | 1番目から11番目の解答結果 (0 or 1) |
colMeans()関数を使って、Q1からQ11それぞれの正答率を計算しなさい。Q1 から Q11 までの合計点を表す変数
total を作るdf_irt <- df_irt |>
dplyr::mutate(total = rowSums(dplyr::across(Q1:Q11),
na.rm = TRUE)) # 欠損値(NA)があっても無視して合計するよう指定df_irt を確認するCorrect Response Rate: crr)を計算 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
0.9384615 0.8000000 0.7031250 0.6718750 0.2187500 0.7076923 0.9692308 0.8750000
Q9 Q10 Q11
0.7692308 0.8000000 0.6153846
df_crr1 <- data.frame( # データフレーム名を指定(ここでは df_crr と指定)
item = names(crr1), # 変数名を指定(ここでは item と指定)
seikai = as.numeric(crr1) # 変数名を指定(ここでは seikai と指定)
) item seikai
1 Q1 0.9384615
2 Q2 0.8000000
3 Q3 0.7031250
4 Q4 0.6718750
5 Q5 0.2187500
6 Q6 0.7076923
7 Q7 0.9692308
8 Q8 0.8750000
9 Q9 0.7692308
10 Q10 0.8000000
11 Q11 0.6153846
ggplot(df_crr1, aes(x = seikai, y = item)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(seikai, 2)), # 小数第2位で丸める
hjust = 1.2, size = 4) + # 棒の内側に表示
labs(
title = "各項目の正答率",
x = "項目",
y = "正答率"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策 cor()関数を使って、素点 (Q1 〜
Q11) と合計点 total
との相関を計算し、除外する必要のある問題等を指摘しなさい。 total
Q1 0.2205236
Q2 0.6584340
Q3 0.6257439
Q4 0.5139615
Q5 0.1458649
Q6 0.3203625
Q7 0.1749797
Q8 0.6140165
Q9 0.3613183
Q10 0.6398342
Q11 0.6999322
it_1
は「「行名付きの1列行列(matrix)」」→ 使い勝手が悪いので、この matrix
をデータフレームに変換して、行名を項目名の列として追加する
# 行列をデータフレームに変換
df_it_1 <- as.data.frame(it_1)
# 行名を項目名として列に追加
df_it_1$item <- rownames(df_it_1)
# 列名をわかりやすく変更(オプション)
colnames(df_it_1) <- c("correlation", "item")ggplot(df_it_1, aes(x = item, y = correlation)) +
geom_bar(stat = "identity", fill = "orange") +
geom_text(aes(label = round(correlation, 3)),
vjust = -0.5, size = 4) +
ylim(0, 0.7) +
labs(
title = "項目-合計相関(item-total correlation)",
x = "項目",
y = "相関係数"
) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策 item1 〜 item5) と各項目得点
(total) との相関は 0.36〜0.61の間I-T相関の計算のポイント ・各項目への反応 (Q1 〜 Q11) と合計点 (total) との間にI-T 相関が認められるかどうか
| IT相関の値 | 評価 | 項目の扱い |
|---|---|---|
| 〜 0.2 | 極めて低い(要注意) | 除外を検討する |
| 0.2〜0.3 | やや低い | 内容によって再検討 |
| 0.3〜0.4 | 妥当なレベル | 保留・文脈による判断 |
| 0.4以上 | 良好(望ましい) | 採用して問題なし |
est()関数を使って、2 パラメタ・ロジスティックモデル
(2PL: 一般化ロジスティックモデル)
で項目母数(識別力と困難度)を推定し、次の問いに答えなさい。ex1 <- est(resp = df_irt[, 3:13], # テストデータを指定する引数
model = "2PL", # 2PLMを仮定
engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定
ex1$est
[,1] [,2] [,3]
Q1 0.8903135 -3.4384464 0
Q2 2.4444466 -1.0340746 0
Q3 1.4913685 -0.8048831 0
Q4 1.0379131 -0.8385596 0
Q5 -0.2678490 -4.8257655 0
Q6 0.2079933 -4.2995429 0
Q7 0.3560097 -9.8629691 0
Q8 3.2230888 -1.3129353 0
Q9 0.4729782 -2.6736123 0
Q10 3.1091149 -0.9653553 0
Q11 5.8745464 -0.3197006 0
$se
[,1] [,2] [,3]
[1,] 0.6497539 2.0824740 0
[2,] 1.0915745 0.2970198 0
[3,] 0.6768648 0.3439727 0
[4,] 0.4893676 0.4320297 0
[5,] 0.3700716 6.5589765 0
[6,] 0.3287564 6.7760695 0
[7,] 0.8370542 22.4835341 0
[8,] 1.6411698 0.3032655 0
[9,] 0.3835592 2.0638826 0
[10,] 1.8800859 0.2290825 0
[11,] 14.1253172 0.1497608 0
$vcm
$vcm[[1]]
[,1] [,2]
[1,] 0.4221801 1.293091
[2,] 1.2930908 4.336698
$vcm[[2]]
[,1] [,2]
[1,] 1.1915349 0.22109685
[2,] 0.2210969 0.08822073
$vcm[[3]]
[,1] [,2]
[1,] 0.4581459 0.1580620
[2,] 0.1580620 0.1183173
$vcm[[4]]
[,1] [,2]
[1,] 0.2394807 0.1467043
[2,] 0.1467043 0.1866497
$vcm[[5]]
[,1] [,2]
[1,] 0.136953 -2.390121
[2,] -2.390121 43.020173
$vcm[[6]]
[,1] [,2]
[1,] 0.1080808 2.184765
[2,] 2.1847648 45.915118
$vcm[[7]]
[,1] [,2]
[1,] 0.7006597 18.74337
[2,] 18.7433729 505.50931
$vcm[[8]]
[,1] [,2]
[1,] 2.6934384 0.33133729
[2,] 0.3313373 0.09196995
$vcm[[9]]
[,1] [,2]
[1,] 0.1471177 0.7515523
[2,] 0.7515523 4.2596113
$vcm[[10]]
[,1] [,2]
[1,] 3.5347231 0.19261119
[2,] 0.1926112 0.05247879
$vcm[[11]]
[,1] [,2]
[1,] 199.5245851 -0.82359383
[2,] -0.8235938 0.02242831
| 項目 | 識別力a | 困難度b | コメント |
|---|---|---|---|
| Q5 | 0.37 | 6.56 | 困難度 b のSE (6.56)が非常に大きい → 推定不安定 |
| Q6 | 0.33 | 6.78 | 困難度 b のSE (6.78)が非常に大きい → 推定不安定 |
| Q7 | 0.84 | 22.48 | 困難度 b のSE (22.48)が非常に大きい → 推定不安定 |
| Q11 | 14.13 | 0.15 | 困難度 a のSE (14.13)が非常に大きい → 推定不安定 |
個別問題の検討
| 項目 | 識別力a | aのSE | 困難度 b | 解釈 | 判断 |
| Q10 | 3.11 | -0.97 | 1.88 | 高能力層に強い安定 | 採用 |
| Q8 | 3.22 | -1.31 | 1.64 | 高識別でバランスも良い | 採用 |
| Q2 | 2.44 | -1.03 | 1.09 | 中~上能力層に対応 | 採用 |
| Q3 | 1.49 | -0.80 | 0.68 | 中程度の識別力と安定性。中能力向け | 採用 |
| Q4 | 1.04 | -0.84 | 0.49 | 安定感があり平均的な難易度 | 採用 |
→ 識別力が非常に高く、難易度も中程度
a = 3.11) > 1
→ 能力が高いほど正答率が上がる a = 3.22) > 1
→ 能力が高いほど正答率が上がるa = 1.04) > 1
→ Q10やQ8程の識別力はない| 項目 | 識別力 a | a のSE | 困難度 b | 解釈 | 判断 |
|---|---|---|---|---|---|
| Q11 | 5.87 | 14.13 | -0.32 | a は高いが(5.87)、SE が高すぎ(14.13) | 不採用 |
| Q5 | -0.27 | 0.37 | -4.83 | 識別力がマイナス => 常に正答 | 不採用 |
| Q7 | 0.36 | 0.84 | -9.86 | 識別力が低い+簡単すぎ → ほぼ正答 | 不採用 |
| Q6 | 0.21 | 0.33 | -4.30 | 識別力が極端に低い+効果がない項目 | 不採用 |
| Q9 | 0.47 | 0.38 | -2.67 | 識別力が境界値。簡単過ぎ | 不採用 |
a = -0.27)< 0」
→ 能力が高いほど正答率が下がる# パラメータ定義(2PLモデル:a = 識別力、b = 困難度)
params <- data.frame(
Item = c("Q11", "Q5", "Q6", "Q7", "Q9"),
a = c(5.8745464, -0.2678490, 0.2079933, 0.3560097, 0.4729782),
b = c(-0.3197006, -4.8257655, -4.2995429, -9.8629691, -2.6736123)
)
# θ(能力値)の範囲を作成
theta <- seq(-4, 4, length.out = 300)
# 項目ごとの P(θ) を計算
icc_data <- do.call(rbind, lapply(1:nrow(params), function(i) {
a <- params$a[i]
b <- params$b[i]
item <- params$Item[i]
p_theta <- 1 / (1 + exp(-a * (theta - b)))
data.frame(theta = theta, P = p_theta, Item = item)
}))
# ggplotで描画
ggplot(icc_data, aes(x = theta, y = P, color = Item)) +
geom_line(size = 1.2) +
labs(
title = "Q11, Q5, Q7, Q6, Q9 の項目特性曲線(2PLモデル)",
x = "能力値 θ",
y = "正答確率 P(θ)"
) +
ylim(0, 1.05) +
theme_minimal() +
theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策